package com.manong.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.manong.dao.RoleMapper;
import com.manong.dao.UserMapper;
import com.manong.entity.Role;
import com.manong.entity.User;
import com.manong.service.RoleService;
import com.manong.vo.query.RoleQueryVo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author 李茂鑫
 * @Date 2025/1/8 11:45
 * @Descripition 服务实现类
 */
@Service
@Transactional
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role>implements RoleService {
    @Resource
    private UserMapper userMapper;

    /**
     * 根据用户 ID 和查询条件分页查询角色列表
     * @param page  分页对象
     * @param roleQueryVo
     * @return
     */

    @Override
    public IPage<Role> findRoleListByUserId(IPage<Role> page, RoleQueryVo roleQueryVo) {
        QueryWrapper<Role> queryWrapper=new QueryWrapper<Role>();
        queryWrapper.like(!ObjectUtils.isEmpty(roleQueryVo.getRoleName()),"role_name",roleQueryVo.getRoleName());
        //根据 roleQueryVo 中的 roleName 值，进行 role_name 字段的模糊查询（LIKE 操作）。
        //查 roleQueryVo 中的角色名称是否为空或 null
        queryWrapper.orderByAsc("id");
        User user = userMapper.selectById(roleQueryVo.getUserId());
        //查询用户信息
        if(user !=null && !ObjectUtils.isEmpty(user.getIsAdmin())&&user.getIsAdmin() !=1){
            //如果用户不为空，不是管理员，则只能查询当前用户的角色信息
            queryWrapper.eq("create_user",roleQueryVo.getUserId());
            //非管理员只能查询当前用户的角色信息
        }
        return baseMapper.selectPage(page,queryWrapper);
    }

    @Override
    public boolean hashRoleCount(Long id) {
        //检查某个角色 ID 是否有权限关联
        return baseMapper.getRoleCountByRoleId(id)>0;
    }

    @Override
    public boolean deleteRoleById(Long id) {
        //删除角色信息，并且在删除前会清除角色与权限的关联关系。
        baseMapper.deleteRolePermissionByRoleId(id);
        return baseMapper.deleteById(id)>0;
    }

    /**
     * 保存角色权限关系
     * @param roleId
     * @param permissionIds
     * @return
     */

    @Override
    public boolean saveRolePermission(Long roleId, List<Long> permissionIds) {
        baseMapper.deleteRolePermission(roleId);
        //删除角色对应的权限信息
        return baseMapper.saveRolePermission(roleId,permissionIds)>0;
        //保存角色权限关系
    }

    /**
     * 根据用户id查询角色id集合
     * @param userId
     * @return
     */
    @Override
    public List<Long> findRoleIdByUserId(Long userId) {
        return baseMapper.findRoleIdByUserId(userId);
    }
}
